package main

import (
	"fmt"
)

func main() {
	fmt.Println(lengthOfLongestSubstring("pwwkew"))
}

/**
思路：
1. 使用 map 来存储，key 为字符串 s 中的字符，value 为该字符在字符串中的索引
2. 如果 map 中有该值，则从 map 中删除该值和前面的值
3. 如果 map 中没有该值，则存储
 */
func lengthOfLongestSubstring(s string) int {
	if len(s) == 0 {
		return 0
	}

	Hmap := make(map[byte]int)
	max := 0

	for i, j := 0, 0; j < len(s); j++ {
		// 如果 map 中有元素即说明重复了
		if val, ok := Hmap[s[j]]; ok {
			// 记录最大值
			if max < len(Hmap) {
				max = len(Hmap)
			}

			// 删除重复元素和重复元素前面的元素
			for ; i <= val; i++ {
				delete(Hmap, s[i])
			}
		}

		Hmap[s[j]] = j
	}

	if max < len(Hmap) {
		max = len(Hmap)
	}

	return max
}
